package com.huanf.controller;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.LambdaUpdateWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.huanf.domain.User;
import com.huanf.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

/**
 * @author: 35238
 * 功能: LambdaQueryWrapper、LambdaUpdateWrapper的条件封装
 * 时间: 2024-01-01 20:00
 */
@RestController
public class LambdaController {

    @Autowired
    private UserMapper userMapper;

    //----------------------------------当满足条件时，才去数据库查询数据------------------------------------

    @GetMapping("/lambda1") //浏览器访问 http://localhost:8050/lambda1
    public String lambda1() {

        //例如用户提交以下3个数据(模拟的)进行模糊查询，然后判断年龄的区间。那我们就首先筛一下给的数据，如果数据满足条件，才作为条件去数据库查询
        String xxname = "";//用户提交的姓名是空字符串
        Integer xxbegin = 20;//用户提交的年龄最小值是20
        Integer xxage = 30;//用户提交的年龄最大值是30

        //创建条件构造器，并判断用户给我们的数据满不满足条件，如果满足才会正常的进入条件构造器
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.like(StringUtils.isNotBlank(xxname),User::getName,xxname)
                .ge(xxbegin != null,User::getAge,xxbegin)
                .le(xxage != null,User::getAge,xxage);
        //多个条件用链式编程，每个条件的括号都是三个参数，分别是'要满足的条件'、'User类的成员变量的get方法'、’用户给你的字段‘。代码中用的方法跟上面的原始组装条件一样，就是写法不同
        //上面那行就显示出QueryWrapper类的条件封装的优点，它不需要你去记数据库的字段，你直接写'User类的成员变量的get方法'即可
        //把赋值好的queryWrapper，放到userMapper里面
        List<User> userList = userMapper.selectList(queryWrapper);
        //由于是List集合，所以我们需要forEach遍历输出
        userList.forEach(System.out::println);
        return "请回idea控制台查看";
    }
    //注意如果某条数据里有逻辑字段，并且逻辑字段不为空，并且该数据已经被逻辑删除了，那么此时执行这里的查询方法，该数据即使符合条件也不会被查询到

    //----------------------------------当满足条件时，才去数据库修改数据------------------------------------

    @GetMapping("/lambda2") //浏览器访问 http://localhost:8050/lambda2
    public String lambda2() {
        LambdaUpdateWrapper<User> updateWrapper = new LambdaUpdateWrapper<>();
        //需求: 将用户名中包含a并且(年龄大于15或邮箱为null)的用户信息修改。注意上面演示过一次，当时用的是QueryWrapper类
        //注意: 需要优先判断括号里的'年龄大于15或邮箱为null'条件
        //创建条件构造器
        updateWrapper.like(User::getName,"小红")
                .and(i->i.gt(User::getAge,15).or().isNull(User::getEmail));
        //上面是满足什么条件我们就会对其进行修改，下面是要修改成什么数据
        updateWrapper.set(User::getName,"LamUpdaWra修改你了").set(User::getEmail,"LamUpdaWra@123.com");//用链式编程修改多个字段数据
        userMapper.update(null, updateWrapper);//由于是修改操作，所以第一个参数可以不提供实体类对象。返回值是受影响的行数
        return "修改成功 请到数据库查看";
    }
    //注意如果k条数据里有逻辑字段，并且逻辑字段不为空，并且k数据已经被逻辑删除了，那么此时执行这里的查询方法，k数据即使符合条件也不会被查询到

}
